/*
 * Copyright (C) 2012 POAS.VSTU
 */

package ui;

import javax.swing.JLabel;
import java.awt.Insets; 
import java.awt.Dimension; 
import java.awt.Rectangle;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.geom.AffineTransform;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Класс вращающаяся метка.
 * Наследуется от JLabel.
 * Реализует повороты метки на 90 градусов в обе стороны и на 180 градусов.
 */
public class UILabel extends JLabel {
    /** Ориентация лейбла */
    Orientation orientation;
    
    /** Конструктор */
    public UILabel() {
        super();
        
        orientation = Orientation.NORMAL;
    }
 
    /** Изменить ориентацию */
    public void setOrientation(Orientation orient) {
        orientation = orient;
    }
    
    /** Получить границы лейбла */
    @Override
    public Rectangle getBounds() {
        Rectangle bounds = super.getBounds();
        
        if(orientation == Orientation.ROTATED_CLOCKWISE || orientation == Orientation.ROTATED_ANTI_CLOCKWISE) {
            int height = bounds.height;
            bounds.height = bounds.width;
            bounds.width = height;
        }
            
        return bounds;
    }
 
    /** Получить ширину */
    @Override
    public int getWidth() {
        if(orientation == Orientation.ROTATED_CLOCKWISE || orientation == Orientation.ROTATED_ANTI_CLOCKWISE)
            return super.getHeight();
        
        return super.getWidth();
    }
 
    /** Получить высоту */
    @Override
    public int getHeight() {
        if(orientation == Orientation.ROTATED_CLOCKWISE || orientation == Orientation.ROTATED_ANTI_CLOCKWISE)
            return super.getWidth();
        
        return super.getHeight();
    }
    
    /** Отрисовать лейбл */
    @Override
    protected void paintComponent(Graphics g) {
        Graphics2D g2d = (Graphics2D) g;
        
        if(orientation == Orientation.ROTATED_CLOCKWISE) {    
            g2d.rotate(Math.toRadians(90));
            g2d.translate(0, -(this.getHeight() + (this.getWidth() - this.getHeight()) / 2));
        }
        else if(orientation == Orientation.ROTATED_ANTI_CLOCKWISE) {            
            g2d.rotate(Math.toRadians(-90));
            g2d.translate(-this.getHeight(), (this.getWidth() - this.getHeight()) / 2);
        }
        else if(orientation == Orientation.INVERTED) {
            g2d.rotate(Math.toRadians(180));
            g2d.translate(-this.getWidth(), -this.getHeight());
        }

        super.paintComponent(g2d);
    }
    
    /** Получить размеры */
    @Override
    public Dimension getPreferredSize() {
        Dimension d = super.getPreferredSize();
        
        if(orientation == Orientation.ROTATED_CLOCKWISE || orientation == Orientation.ROTATED_ANTI_CLOCKWISE) {
            int width = d.width;
            d.width = d.height;
            d.height = width;
        }
        
        return d;
    }
 
    /** Получить максимальный размер */
    @Override
    public Dimension getMinimumSize() {
        Dimension d = super.getMinimumSize();
         
        if(orientation == Orientation.ROTATED_CLOCKWISE || orientation == Orientation.ROTATED_ANTI_CLOCKWISE) {
            int width = d.width;
            d.width = d.height;
            d.height = width;
        }
        
        return d;
    }
 
    /** Получить минимальный размер */
    @Override
    public Dimension getMaximumSize() {
        Dimension d = super.getMaximumSize();
         
        if(orientation == Orientation.ROTATED_CLOCKWISE || orientation == Orientation.ROTATED_ANTI_CLOCKWISE) {
            int width = d.width;
            d.width = d.height;
            d.height = width;
        }
        
        return d;
    }   
}
